package com.example.entity;

import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;

public record RestBean<T>(int code, T data, String message) {
    /**
     * 创建一个表示成功请求的RestBean对象
     * 该方法用于当API请求成功时，封装返回给客户端的数据和状态信息
     * @param <T> 泛型参数，表示可以传入任意类型的对象
     * @param data 请求成功后返回的数据，可以是任意类型
     * @return RestBean<T> 包含状态码、数据和消息的RestBean对象
     */
    public static <T> RestBean<T> success(T data) {
        return new RestBean<>(200, data, "请求成功");
    }
    public static <T> RestBean<T> success() {
        return success(null);
    }
    public static <T> RestBean<T> failure(int code, String message) {
        return new RestBean<>(code, null, message);
    }

    public static RestBean<Object> unauthorized(String message) {
        return failure(401,message);
    }
    public static RestBean<Object> forbidden(String message) {
        return failure(403,message);
    }
    /**
     * 将对象转换为JSON字符串
     * <p>
     * 使用JSONObject.toJSONString方法序列化此对象为JSON格式的字符串，并包含空值字段
     * 这种序列化方式确保了即使对象中的某些字段为null，这些字段也会被写入到结果字符串中
     * @return 包含空值的JSON字符串表示的对象
     */
    public String asJsonString() {
       return JSONObject.toJSONString(this, JSONWriter.Feature.WriteNulls);
    }

}
